iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0

大家好!延續上一篇介紹函式的基本概念,今天要來繼續講函式參數的三種類型啦!它們分別是:可選參數預設參數剩餘參數


可選參數(Optional Parameter)

還記得我在第五天介紹到的可選屬性嗎?可選參數的定義和可選屬性一樣,都是屬於可以給對象提供值,也能不提供值。但是,可選參數在函式中有規定必須遵守,否則TypeScript會報錯!和可選屬性一樣,可選參數也是用?表達。

//可選參數範例:
function studentInfo(name: string, department?: string) {
	if (department) { 
		console.log(`${name}, ${department}`); 
	} else { 
		console.log(`${name}`); 
	} 
}
studentInfo("Judy"); //輸出:Judy
studentInfo("Judy", "法語系"); //輸出:Judy, 法語系

//假設今天我把兩個參數的位置調換,會發生什麼事?
function studentInfo(department?: string, name: string) {
	if (department) { 
	console.log(`${name}, ${department}`); 
	} else { 
	console.log(`${name}`); 
	} 
} //因為TS規定必填參數不能放在可選參數後面,TS會因此報錯喔!

//如果沒有賦予可選參數一個值,那他會是甚麼型別呢?
function studentInfo(name: string, department?: string) {
	console.log(`${name}`); 
}
studentInfo("Judy"); 
//如果呼叫函式時沒有提供可選參數,該參數的值會是undefined。
//因此在使用它之前,可以透過條件判斷確認是否有傳入值。

預設參數(Default Parameter)

預設參數和可選參數一樣,在呼叫函式時可以不提供值,差別在於,預設參數會先設定一個預設值。當呼叫函式時沒有提供這個參數,就會自動使用預設值;如果有提供值,則會使用傳入的值。

//預設參數範例:
function p(price: number, discount: number = 0.5): number{
	return price * discount;
}

//假設沒有傳入discount時,會自動套用預設值 0.5
console.log(p(10)); //輸出:10 * 0.5 = 5

//也可以傳入自訂的值來覆蓋預設值
console.log(p(10, 0.1)); //此時輸出會是1

和可選參數不同的是,預設參數可以往前放,如果想跳過預設參數,直接傳入後面的參數,就需要在該位置傳入undefined

剩餘參數

當我們不知道使用者會傳入多少參數時,剩餘參數能幫助函式將傳入的參數統整成一個陣列。須以...寫在參數前方表示。

//剩餘參數範例:
function sum(...numbers: number[]) { 
//因為剩餘參數最後會整合成一個陣列,我們需要定一個陣列型別
  //用reduce加總陣列裡的參數
  const total = numbers.reduce((acc, curr) => acc + curr, 0);
  console.log(`${total}`);
}

sum(1, 2, 3); // 輸出: 6
sum(3, 3, 2, 3, 3); // 輸出: 14

//錯誤示範:
sum(1, 4, 6, "Apple") // 因為指定了number作為陣列型別,放入string的資料會導致TS報錯

需要注意的是,剩餘參數永遠只能是函式的最後一個參數,而且一個函式只能有一個剩餘參數喔!


小結

今天介紹了三個常見的函式參數,我覺得很容易搞混的是可選參數和預設參數,剩餘參數反倒沒有和前兩者那麼相像,但是我還是會把三者做成一個表格方便大家參考他們之間的差異!

可選參數 預設參數 剩餘參數
主要用途 將參數定義為可傳可不傳 不傳值時,直接套用預先寫好的參數 接收不固定數量的參數,並整理成一個陣列
寫法 在參數後加上? 參數 : 型別 = 預設值 在參數前加上...,並在後面宣告陣列型別
位置 只能在必填參數後,不能寫在第一個參數的位置 可以放在必填參數前面,但跳過時需傳入 undefined 必須是參數列表的最後一個

沒想到不知不覺就寫到第十天了!今天的內容就先到這裡,我們明天見!


上一篇
[Day-9] 函式(Function)-1
下一篇
[Day-11]TypeScript的特殊型別
系列文
從零開始學習TypeScript:菜鳥的入門介紹與概覽22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言